package com.cneport.das.common.utils;

import cn.hutool.core.io.FileUtil;

import java.io.File;
import java.io.InputStream;
import java.nio.charset.Charset;

/**
 * @author GavinZhang
 * @version 1.0
 * @desc： 压缩有关的工具类
 * @company 东方物通科技有限（北京）公司
 * @date 2021/7/20 20:24
 */
public class ZipUtil {
    /**
     * 以默认的方式压缩文件或目录
     *
     * @param filepath
     * @return
     */
    public static File zip(String filepath) {
        return cn.hutool.core.util.ZipUtil.zip(filepath);
    }

    /**
     * 以指定字符集的方式压缩
     *
     * @param filepath
     * @param charset
     * @return
     */
    public static File zip(String filepath, Charset charset) {
        return cn.hutool.core.util.ZipUtil.zip(filepath, charset);
    }

    /**
     * 将文件或目录压缩成指定名称的压缩文件
     *
     * @param filepath
     * @param zipFilePath
     * @return
     */
    public static File zip(String filepath, String zipFilePath) {
        return cn.hutool.core.util.ZipUtil.zip(filepath, zipFilePath);
    }

    /**
     * 将文件或目录压缩成指定名称的压缩文件,并且可指定是否包含原来的外层目录
     *
     * @param filepath
     * @param zipFilePath
     * @param withSrcDir
     * @return
     */
    public static File zip(String filepath, String zipFilePath, boolean withSrcDir) {
        return cn.hutool.core.util.ZipUtil.zip(filepath, zipFilePath, withSrcDir);
    }

    /**
     * 解压指定的压缩文件
     *
     * @param zipFile
     * @return
     */
    public static File unZip(String zipFile) {
        return cn.hutool.core.util.ZipUtil.unzip(zipFile);
    }

    /**
     * 解压指定的压缩文件到指定的目录
     *
     * @param zipFile
     * @param outFileDir
     * @return
     */
    public static File unZip(String zipFile, String outFileDir) {
        return cn.hutool.core.util.ZipUtil.unzip(zipFile, outFileDir);
    }

    /**
     * 多文件或多目录压缩
     *
     * @param outFile   压缩文件名称
     * @param charset   压缩的字符集
     * @param fileNames 源文件名称（含路径）
     * @return
     */
    public static File multiZip(String outFile, Charset charset, String[] fileNames) {

        File[] files = new File[fileNames.length];
        for (int i = 0; i < fileNames.length; i++) {
            files[i] = FileUtil.file(fileNames[i]);
        }
        return cn.hutool.core.util.ZipUtil.zip(new File(outFile), charset, false, files);
    }

    /**
     * 压缩字符串
     *
     * @param content
     * @param charset
     * @return
     */
    public static byte[] gZip(String content, String charset) {
        return cn.hutool.core.util.ZipUtil.gzip(content, charset);
    }

    /**
     * 压缩文件
     *
     * @param fileFullName
     * @return
     */
    public static byte[] gZip(String fileFullName) {
        return cn.hutool.core.util.ZipUtil.gzip(new File(fileFullName));
    }

    /**
     * 压缩输入流
     *
     * @param inputStream
     * @return
     */
    public static byte[] gZip(InputStream inputStream) {
        return cn.hutool.core.util.ZipUtil.gzip(inputStream);
    }

    /**
     * 对输入流指定长度进行压缩
     *
     * @param inputStream
     * @param length
     * @return
     */
    public static byte[] gZip(InputStream inputStream, int length) {
        return cn.hutool.core.util.ZipUtil.gzip(inputStream, length);
    }

    /**
     * 对字节数组进行压缩
     *
     * @param buf
     * @return
     */
    public static byte[] gZip(byte[] buf) {
        return cn.hutool.core.util.ZipUtil.gzip(buf);
    }

    /**
     * 对字节流进行解压缩
     *
     * @param buf
     * @return
     */
    public static byte[] unGzip(byte[] buf) {
        return cn.hutool.core.util.ZipUtil.unGzip(buf);
    }

    /**
     * 对字符串进行解压缩
     *
     * @param buf
     * @param charset
     * @return
     */
    public static String unGzip(byte[] buf, String charset) {
        return cn.hutool.core.util.ZipUtil.unGzip(buf, charset);
    }

    /**
     * 对输入流进行解压缩
     *
     * @param inputStream
     * @return
     */
    public static byte[] unGzip(InputStream inputStream) {
        return cn.hutool.core.util.ZipUtil.unGzip(inputStream);
    }

    /**
     * 对输入流的多长解压缩成字节数组
     *
     * @param inputStream
     * @param length
     * @return
     */
    public static byte[] unGzip(InputStream inputStream, int length) {
        return cn.hutool.core.util.ZipUtil.unGzip(inputStream, length);
    }
}

